/**
 * 给定2个字符串S和T，要求满足以下条件：
 * 1. S取前缀记作ps, T取后缀记作st, 要求 ps == st, 且均为回文串
 * 2. S取后缀ss, T取前缀pt, 要求 ss == pt，且均为回文串
 * 3. ps和ss非空且不能重叠
 * 4. pt和st非空且不能重叠
 * 5. 要求4个串加起来最长
 * 
 * S长度记作N，T长度记作M，对S和T分别求出Manacher数组
 * 弄一个动态数组pre
 * for i, j in zip([0, N-1],[M-1, 0]):
 *     if Si != Tj: continue
 *     if S[0...i]和T[M-j...M-1] 是回文串: pre.push_back(i) 
 * 弄一个动态数组suf
 * for i, j in zip([N-1, 0], [0, M-1]):
 *     if Si != Tj: continue
 *     if S[N-i...N-1]和T[0..j] 均是回文串: suf.push_back(i)
 * 
 * 如何检查某个前缀是回文串?在Manacher数组中，对于原字符串位置i, 
 * 如果某个r[another]大于等于某个值，就能确定[0...i]是回文串
 * 对于后缀有类似的处理手段
 * 
 * 把suf数组reverse一下，然后对pre中的每个i，找到最小的符合条件的j，计算一下求最大值即可
 * 可以使用二分搜索
 * 令 limit = min(N, M)
 * for i in pre:
 *     target = N + i + 1 - limit
 *     在suf数组中找到满足 >= target 的最小的数，记作j
 *     ans = max(ans, i + 1 + N - j)
 * ans + ans 是答案
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;

template<typename IT = const char *>
struct Manacher{

using vi = vector<int>;
using pii = pair<int, int>;

/// 从begin开始，一共n个
Manacher(IT begin, int n){
    tmp.reserve(n + n + 3);
    tmp.emplace_back(-2);
    tmp.emplace_back(-1);

	auto it = begin;
    for(int i=0;i<n;++i){
        assert(*it >= 0);
        tmp.emplace_back(*it++);
        tmp.emplace_back(-1);
    }
    tmp.emplace_back(-3);
    assert(tmp.size() == n + n + 3);

    r.assign(tmp.size(), 0);
    r[0] = r[1] = 1;

    int x = 1, total = r.size(), k;
    while(x < total){
        for(k=1;k<r[x];++k){
            if(k + r[x - k] == r[x]) break;
            r[x + k] = min(r[x - k], r[x] - k);
        }

        /// 半径至少是1或者r[x - k]
        r[x + k] = k == r[x] ? 1 : r[x - k];
        if((x += k) >= total - 1) break;
        while(tmp[x + r[x]] == tmp[x - r[x]]) ++r[x];
    }

    auto & ret = result.first;
    auto & start = result.second;
    for(int t,i=0;i<total;++i){
        t = r[i] - 1;
        if(ret < t) start = (i - (ret = t)) >> 1;
    }

    return;
}

const pii & get() const {return result;}

public:
vi tmp; // 临时数组
vi r; // 回文半径数组
pii result; // <最长回文长度, 第一个开始的地方>, 从0开始编号

};

using mtype = Manacher<string::const_iterator>;

int N, M;
string S, T;

bool check(const string & s, int sp, const mtype & ms, const string & t, int tp, const mtype & mt){
    int pos = sp + 2;
    int r = ms.r[pos];
    if(r < pos - 1) return false;

    int n = t.length();
    int limit = n - tp;
    pos = tp + n + 1;
    r = mt.r[pos];
    if(r < limit) return false;
    return true;
}

int proc(){
    Manacher<string::const_iterator> ms(S.begin(), N);
    Manacher<string::const_iterator> mt(T.begin(), M);

    vector<int> pre;
    for(int i=0,j=M-1;i<N&&j>=0;++i,--j){
        if(S[i] != T[j]) break;
        if(check(S, i, ms, T, j, mt)){
            pre.emplace_back(i);
        }
    }

    if(pre.empty()) return -1;

    vector<int> suf;
    for(int j=0,i=N-1;i>=0&&j<M;++j,--i){
        if(S[i] != T[j]) break;
        if(check(T, j, mt, S, i, ms)){
            suf.push_back(i);
        }
    }

    if(suf.empty()) return -1;
    reverse(suf.begin(), suf.end());

    int limit = min(N, M);
    int ans = -1;
    for(auto i : pre){
        auto pp = equal_range(suf.begin(), suf.end(), N + i + 1 - limit);
        if(pp.first != pp.second){
            auto t = *pp.first;
            int tmp = i + 1 + N - t;
            if(-1 == ans or ans < tmp){
                ans = tmp;
            }
        }else if(pp.second != suf.end()){
            auto t = *pp.second;
            int tmp = i + 1 + N - t;
            if(-1 == ans or ans < tmp){
                ans = tmp;
            }
        }
    }
    return ans + ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1; 
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> M >> S >> T;
        cout << proc() << "\n";
    }
    return 0;
}